<template>
{{#if ctrl.psSysPFPlugin}}
  {{> @macro/plugins/widget/widget-use.hbs appPlugin=ctrl.psSysPFPlugin}}
{{else}}
  <div :class="classNames" :id="controlID"{{#or ctrl.width ctrl.height}} style="{{#if ctrl.width}}width: {{ctrl.width}}px;{{/if}}{{#if ctrl.height}}height: {{ctrl.height}}px;{{/if}}"{{/or}}>
    <a-form class="control-content">
      <AppGrid
        v-bind="$attrs"
        :columns="model.columns"
        :aggData="store.aggData"
        :items="store.data"
        :singleSelect="singleSelect"
        :localMode="localMode"
        :selections="store.selections"
        :showHeader="model.showHeader"
        :current="store.curPage"
        :limit="store.limit"
        :columnFilter="store.columnFilter"
        :totalRecord="store.totalRecord"
        :context="store.context"
        :viewParams="store.viewParams"
        :enableRowEdit="model.enableRowEdit"
        :enableAgg="model.aggMode !== 'NONE'"
        :rowActiveMode="rowActiveMode"
        :customCallBack="handleCustomCallBack()"
  {{#if ctrl.enablePagingBar}}
        :paging="model.paging"
  {{/if}}
  {{#if ctrl.emptyText}}
        :emptyText="{{#if ctrl.emptyTextPSLanguageRes}}$t('{{ctrl.emptyTextPSLanguageRes.lanResTag}}', '{{ctrl.emptyText}}'){{else}}{{ctrl.emptyText}}{{/if}}"
  {{/if}}
        @row-click="handleRowClick"
        @row-db-click="handleRowDbClick"
        @selection-change="handleSelectionChange"
        @add-item="() => controller.newRow()"
        @remove-item="(row: IParam, index: number) => controller.remove([row])"
  {{#unless ctrl.noSort}}
        @sort-change="(field: string, dir: '' | 'asc' | 'desc') => handleSortChange(controller, field, dir)"
  {{/unless}}
  {{#if ctrl.enablePagingBar}}
        @page-change="(currentPage: number) => handlePageChange(controller, currentPage)"
        @page-size-change="(pageSize: number) => handlePageSizeChange(controller, pageSize)"
  {{/if}}
        @column-filter-change="handleFilterChange"
        @action-click="(logic: any, data: IParam, event: MouseEvent) => handleActionClick(controller, logic as IViewLogicInput, data, event)"
      >
  {{#each ctrl.psDEGridColumns as | column |}}
        {{> @macro/widgets/grid-detail/include-grid.hbs type='GRIDCOLUMN' column=column grid=ctrl}}
  {{/each}}
      </AppGrid>
    </a-form>
  </div>
{{/if}}
</template>
<script setup lang="ts">
// 基于template/src/widgets/\{{appEntities}}/\{{ctrls@GRID}}-grid/\{{spinalCase ctrl.codeName}}-grid.vue.hbs生成
{{> @macro/plugins/widget/widget-import.hbs ctrl=ctrl}}
{{importPlugin 'grid' ctrl}}
import { AppGrid } from "@components/widgets/grid";
import { IContext, IParam, IViewLogicInput } from "@/core";
import { GridActionType, ICtrlDataAction, IGridAbility, IGridControllerParams, IGridStore, GridController, ILoadingHelper, LoadingHelper, createUUID, IViewCtx, ControlVOBase } from "@/core";
{{#or ctrl.enablePagingBar (neq ctrl.noSort true)}}
import { {{#if ctrl.enablePagingBar}}handlePageChange, handlePageSizeChange, {{/if}}{{#unless ctrl.noSort}}handleSortChange, {{/unless}}handleComponentAction } from '@/hooks/use-ctrl';
{{/or}}
import { AppGridColumn, AppGridColumnHeader } from '@components/widgets/grid';
import { useNavParamsBind, useEventBind, handleActionClick, getCtrlClassNames } from '@/hooks/use-ctrl';
import { {{pascalCase ctrl.name}}ControlVO } from './{{spinalCase ctrl.codeName}}-grid-vo';
import { model } from "./{{spinalCase ctrl.codeName}}-grid-model";
import GridService from "@/core/modules/ctrl-service/grid-service";
{{> @macro/widgets/ctrl/ctrl-props.hbs
    props="openView?: Function;
    newView?: Function;
    actions: ICtrlDataAction;
    selectFirstDefault?: boolean;
    rowActiveMode?: 0 | 1 | 2;
    defaultEnableRowEdit?: boolean;
    autoLoad?: boolean;
    localMode?: boolean;
    singleSelect?:boolean"
    propsDefault="rowActiveMode: 2,
    autoLoad: false,
    localMode: false,
    singleSelect: false"
}}

{{> @macro/common/emit.hbs name="ctrl" actionType="GridActionType" ability="IGridAbility"}}

//  部件样式名
const classNames = computed(() => {
  const names = getCtrlClassNames(model, props);
  Object.assign(names, {
    "app-control-grid--no-paging-bar": model.enablePagingBar
  });
  return names;
});

const controlID = createUUID();
const ctrlService = new GridService<ControlVOBase[]>({{pascalCase ctrl.name}}ControlVO, model.entityCodeName);
const params: IGridControllerParams<GridActionType, IGridAbility> = {
  name: props.name,
  model,
  evt,
  controlID,
  autoLoad: props.autoLoad,
  pLoadingHelper: props.pLoadingHelper,
  defaultEnableRowEdit: props.defaultEnableRowEdit,
  actions: props.actions,
  rowActiveMode: props.rowActiveMode,
  singleSelect: props.singleSelect,
  selectFirstDefault: props.selectFirstDefault,
  ctrlService: ctrlService,
  openView: props.openView,
  newView: props.newView,
  closeView: props.closeView,
  pViewCtx: props.pViewCtx,
  handler: (data: IGridStore) => { return reactive(data) }
};
//  表格控制器
const controller = new GridController(params);
useNavParamsBind(controller, props);
const store: IGridStore = controller.getStore();

const handleRowClick = (row: IParam, event: MouseEvent) => {
    controller.rowClick(row, event);
}

const handleFilterChange = ($event: IParam) => {
    controller.handleFilterChange($event);
}
const handleRowDbClick = (row: IParam, event: MouseEvent) => {
    controller.rowDbClick(row, event);
}

const handleSelectionChange = (selections: IParam[]) => {
    controller.selectionChange(selections);
}

const handleCustomCallBack = ()=>{
    return controller.customCallBack();
}

onMounted(() => {
    controller.ctrlMounted();
});
onUnmounted(() => {
    controller.ctrlDestroy();
})
</script>
